'''
k Nearest Neighbor k邻近算法 简单的分类算法
1. 计算当前要分类的点与数据集的所有点之间的距离并排序
2. 选距离最小的前k个点
3. 确定前k个点中所属类别的出现频率
4. 以频率最高的类别作为预测分类
'''

import numpy as np
import operator


def create_data_set():
    group = np.array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
    labels = ['A', 'A', 'B', 'B']
    return group, labels


def classify(inX, dataSet, labels, k):
    # 数据集向量的数量
    data_set_size = dataSet.shape[0]
    # tile将输入的向量复制多份并与数据集相减求出差值
    diff_mat = np.tile(inX, (data_set_size, 1)) - dataSet
    # 差值平方和再开方即为距离
    sq_diff_mat = diff_mat ** 2
    # axis=1 表示按行相加 默认为None 即所有元素相加
    distance = sq_diff_mat.sum(axis=1) ** 0.5
    # 对索引进行排序 默认升序 加负号即为降序
    sorted_dist_indicies = np.argsort(-distance)
    class_count = {}
    for i in range(k):
        vote_ilabel = labels[sorted_dist_indicies[i]]
        # 如果键的值不存在 则默认为0
        class_count[vote_ilabel] = class_count.get(vote_ilabel, 0) + 1
    # 比较字典的值 operator.itemgetter(1)
    sorted_class_count = sorted(class_count.items(), key=operator.itemgetter(1), reverse=True)
    # 返回的是值最大的键
    return sorted_class_count[0][0]


group, labels = create_data_set()
input = [0.6, 0.2]
#res = classify(input, group, labels, 3)
#print(res)
